#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int p[N]; // parent[i] 存储i的根节点
int n, m;
void Initial(int n){ // 普通合并：初始化各自是一个集合
    for (int i = 1; i <= n; ++ i) p[i] = i;
}
// 按照2和3方式合并的初始化
// void Initial(int n){
//     for(int i = 1; i <= n; ++i){
//         p[i] = -1;
//     }
// }
int Find(int x) // 找到x对应的根节点
{
    // 普通查找
	if(p[x] == x) return x;
    else return Find(p[x]);
    // 优化o(1)效率（路径压缩） else return p[x] = Find(p[x]);
    // ！！！路径压缩会改变树的高度

    // 2和3方式的查找
    if(p[x] < 0) return x;
    else return Find(p[x]);
}
void Union(int x, int y)
{
    int rx = Find(x);
    int ry = Find(y);
    // 1. 普通合并
    if(rx != ry){
        p[ry] = rx;
    }
    // 2. 按照高度合并
    // if(rx != ry){
    //     if(p[rx] < p[ry]){
    //         p[ry] = rx;
    //     }
    //     else if(p[ry] < p[rx]){
    //         p[rx] = ry;
    //     }
    //     else{
    //         p[rx] = ry;
    //         p[ry]--;
    //     }
    // }
    // 3. 按照结点数合并
    // if(rx != ry){
    //     if(p[rx] < p[ry]){
    //         p[rx] += p[ry];
    //         p[ry] = rx;
    //     }else if{
    //         p[ry] += p[rx];
    //         p[rx] = ry;
    //     }
    // }

}
void Query(int x, int y)
{
    if(Find(x) == Find(y)) cout << "Yes\n";
    else cout << "No\n";
}
int main()
{
	cin >> n >> m;
	Initial(n);

	while (m --)
	{
		char op;
		int a, b;
		cin >> op >> a >> b;
		if (op == 'M') Union(a, b);
		else Query(a, b);
	}
	return 0;
} 